﻿#ifndef SYS_DEF
#define SYS_DEF


#ifndef _WIN32
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <memory.h>
#endif  // not _WIN32

#define  MAX_TEXT_LEN       32   //文本长度
#define  MAX_NAME_LEN       32   //数据库名称长度
#define  BASE_DESP_LEN      64   //数据库描述长度
#define  TAG_NAME_LEN       64   //测点名称长度
#define  TAG_DESP_LEN       100  //测点描述长度
#define  TAG_KKS_LEN        24   //测点编码长度
#define  DRV_TYPE_LEN       16   //驱动类型长度
#define  DRV_ADDR_LEN       64   //驱动地址长度
#define  MAX_UNIT_LEN       24   //测点单位长度
#define  MAX_STR_LEN        256  //字符串值长度
#define  MAX_PATH_LEN       180  //路径长度
#define  MAX_COPIES_COUNT   8    //最大副本数
#define  MAX_EXP_LEN        1024 //表达式长度
#define  MAX_PERIOD_COUNT   5    //最大历史处理时间段
#define  MAX_COLLECT_PACK_LEN    8192 //最大采集器数据包长度

#define  RUN_MODE_ALONE        0 //单机模式
#define  RUN_MODE_MASTER_SLAVE 1 //主从模式
#define  RUN_MODE_CLUSTER      2 //集群模式

//数据类型定义
#define int8    char
#define uint8   unsigned char
#define int16   short
#define uint16  unsigned short
#define int32   int
#define uint32  unsigned int
#define intl    long
#define uintl   unsigned long
#define sint64  long long
#define uint64  unsigned long long
typedef void *  fileid;
#define TAGID   long long
#define DKEY    long long
typedef void *  SPVOID;

#define INVALID_TAGID  -1
#define INVALID_DKEY   -1
#pragma pack(1)

//数据类型
enum {
    DT_FLOAT,   //浮点型
    DT_BOOL,    //布尔型
    DT_INT,     //整  型
    DT_UINT,    //无符号整型
    DT_LONG,    //长整型
    DT_ULONG,   //无符号长整型
    DT_INT64,   //64位整型
    DT_DOUBLE,  //双精度
    DT_STR      //字符串
};

//历史查询模式
enum {
    SAMPLE_MODE,        //抽样方式
    CHARACTOR_MODE,     //特征值方式
    ARCHIVE_MODE,       //归档方式
    MAX_MODE,           //最大值方式
    MIN_MODE,           //最小值方式
    AVG_MODE            //平均值方式
};

//测点索引
typedef  struct{
	int             nTagId;            //测点ID
	int             nBaseId;           //库ID
} TAG_IDX; 

//数据值
union D_VAL{
    float         fval;   //浮点型
    uint8         bval;   //布尔型
    int32         ival;   //32位整型
    uint32        uival;  //32位无符号整型
    sint64        i64val; //64位整型
    intl          lval;   //长整型
    uintl         ulval;  //无符号长整型
    double        dval;   //双精度浮点型     
    int8         *pstr;   //字符串
};

//测点值
typedef struct {
    D_VAL val;    //值
    uint8 vt;     //值类型
} TAG_VAL;        //变体数据类型

//短时间
typedef struct
{
    uint8  hour;   //时
    uint8  min;    //分
    uint8  sec;    //秒
} SHORT_TIME;

//毫秒级时间
typedef struct
{
    uint8  year;   //年
    uint8  mon;    //月
    uint8  day;    //日
    uint8  hour;   //时
    uint8  min;    //分
    uint8  sec;    //秒
    short msec;   //毫秒
} MS_TIME;

//秒级时间
typedef struct
{
    uint8  year;   //年
    uint8  mon;    //月
    uint8  day;    //日
    uint8  hour;   //时
    uint8  min;    //分
    uint8  sec;    //秒
} SC_TIME;

//日期
typedef struct
{
    uint8  year;   //年
    uint8  mon;    //月
    uint8  day;    //日
} SC_DATE;

//数据品质
enum {
    Q_GOOD,       //正常
    Q_SCANOFF,    //强制
    Q_L3,         //越下3限
    Q_LL,         //越下下限
    Q_LO,         //越下限
    Q_UP,         //越上限
    Q_UU,         //越上上限
    Q_U3,         //越上3限  
    Q_BAD=8,      //异常
    Q_TIMEOUT=9,  //超时
    Q_DATAERR=10, //数据错误/未读取数据
    Q_DRVERR=11,  //驱动错误
    Q_ADDRERR=12, //地址错误
    Q_SVRERR=13,  //服务错误
    Q_HWERR=14,   //硬件故障
    Q_UNVALID=15  //无效数据
};

//压缩算法
enum {
	HFM_CMPS,  //哈夫曼压缩
	XZM_CMPS,  //旋转门压缩
	LMT_CMPS,  //死区限制压缩
	NON_CMPS   //无压缩
};

//----------------------------- 数据信息 -------------------------------//
typedef struct
{
    MS_TIME   tmTime;                    //数据时间
    TAG_VAL   Val;                       //数据值
    uint8     nQuality;                  //数据品质
} DATA_INFO;                             //数据信息

//索引测点数据
typedef struct
{
    TAGID     nTagId;                    //测点ID
    DATA_INFO TagData;                   //测点数据
} TAG_DATA;                              //测点数据

//编号测点数据
typedef struct
{
    TAGID     nTagNo;                    //测点ID
    DATA_INFO TagData;                   //测点数据
} TAGNO_DATA;  

//字符串测点数据
typedef struct
{
    TAGID     nTagId;                    //测点ID
    MS_TIME   tmTime;                    //数据时间
    int8      szVal[MAX_STR_LEN];        //数据值
    uint8     nQuality;                  //数据品质
} TAG_STRDATA;                           //字符串数据
 
//反写控制数据
typedef struct
{
    TAGID     nTagId;                    //测点ID
    double    dTagVal;                   //数据值
} TAG_WRITEDATA;

//历史最值统计结构(float、double型数据)
typedef struct {
    double      dMaxVal;                 //最大值
    double      dMinVal;                 //最小值
    double      dAvgVal;                 //平均值
    SC_TIME     tmMaxTime;               //最大值发生时间
    SC_TIME     tmMinTime;               //最小值发生时间
} TOTLE_DATA;

typedef struct
{
    int           nLen;   //数据长度
    char         *pData;  //数据
} MEM_DATA; //内存数据区

//--------------------------- 数据库与测点信息 -----------------------------//
#define    STORE_WEEK_TYPE    0   //秒级周期存储
#define    STORE_EVENT_TYPE   1   //毫秒级事件存储
#define    STORE_STRING_TYPE  2   //字符串存储
#define    STORE_NONE_TYPE    255 //不存储

#define    TAG_COLLECT_TYPE   0   //采集点
#define    TAG_EXCEPT_TYPE    1   //例外报告
#define    TAG_CALC_TYPE      2   //计算点
#define    TAG_INPUT_TYPE     3   //外部录入点
#define    TAG_IONODE_TYPE    4   //网关服务点

//测点名称
typedef struct
{
    int8   szTagName[TAG_NAME_LEN];      //测点名称
} TAG_NAME;

typedef struct
{
    int32  nBaseId;                      //所属库
    int32  nDirId;                       //所属目录
    int32  nVNodeId;                     //所属虚拟节点ID
    int32  nTagId;                       //测点索引
    int32  nTagNo;                       //测点编号
    int8   szTagName[TAG_NAME_LEN];      //测点名称
    int8   szTagDesp[TAG_DESP_LEN];      //测点描述
    int8   szKKS[TAG_KKS_LEN];           //KKS编码
    uint8  bEnabled;                     //有效状态 0:无效，1:有效
    uint8  nDataType;                    //数据类型
    uint8  nPointNum;                    //小数位数
    int8   szUnit[MAX_UNIT_LEN];         //测点单位
    uint8  nDrvType;                     //0采集点(周期) 1采集点(例外报告) 2计算点 3手工录入 4网关服务点 5网关计算点(周期) 6网关计算点(例外报告)
    int8   szDrvName[DRV_TYPE_LEN];      //驱动名称
    int8   szDrvAddr[DRV_ADDR_LEN];      //驱动地址
    int32  nExpressId;                   //表达式号
    float  fCollectLimit;                //例外报告采集限值
    int32  nCollectWeek;                 //采集周期
    int32  nSaveHisWeek;                 //存储周期
    uint8  nArchiveStyle;                //归档类型，0 周期秒 1毫秒 2字符串 FF不存储
    uint8  nCompress;                    //压缩策略标识
    float  fCmpLimit;                    //死区限值
    float  fUp3Limit;                    //报警上3限
    float  fUupLimit;                    //报警上上限
    float  fUpLimit;                     //报警上限
    float  fLowLimit;                    //报警下限
    float  fLlowLimit;                   //报警下下限
    float  fLow3Limit;                   //报警下3限
    float  fMinVal;                      //量程最小值
    float  fMaxVal;                      //量程最大值
    float  fMaxLimit;                    //限定最大值
    float  fMinLimit;                    //限定最小值
    float  fBaseVal;                     //基值
    uint8  bAlarmLimit;                  //报警使能，0:上限 1:上上限 2:下限 3:下下限 4:上3限 5: 下3限  6:限定最大值 7:限定最小值
    uint8  bAlarmEnable;                 //报警使能，0:变位 1:置位 2:复位  4:报警总开关 5:报警延时 6:报警闭锁
    uint16 nAlarmDelay;                  //报警延迟
    int32  nAlarmLock;                   //报警闭锁
    uint8  nAlarmPrior;                  //报警优先级
    uint8  nAlarmArea;                   //报警区
    uint16 nSetDNodeId;                  //指定数据节点存储
    SC_TIME CreateTime;                  //创建时间
    int     nRegAddr;                    //网关设备寄存器地址
    uint8   res[26];                     //备用
}TAG_INFO;                               //测点信息

//测点表达式参数
typedef struct
{
    int32  nTagId;                       //所属测点ID
    int32  nExpressId;                   //表达式号
    int8   szExpress[MAX_EXP_LEN];       //表达式
    uint8  bTotleSampleTime;             //历史计算使能，按固定时间段统计  低4位:表示固定时间段类型(0:秒 1:分 2:时 3:日 4:月 5:年 6:自定义)
                                         //高4位:自定义时间段数 0表示：按固定周期统计 >0表示按自定义每日时间段
    uint8  nDataTotleFun;                //数据处理功能 0:无 1:复位时累计 2累计 3计数(上升延) 4计数(变位) 5计时
                                         //6平均 7最大值 8最小值 9最大值发生时间 10最小值发生时间 11偏差 12变化率 13延时
    uint32 nSampleTime;                  //历史计算样本周期
    SHORT_TIME SamplePeriod[MAX_PERIOD_COUNT];//自定义时间段
}EXPRESS_INFO;

//测点参数
typedef  struct{
        int             nTagCount;       //测点数
        TAG_INFO       *pTag;            //测点信息
} TAG_PAR; 

//测点数据区
typedef struct
{
    TAG_INFO  TagInfo;                   //测点参数
    DATA_INFO Data;                      //测点数据
} TAG_CACHE;                             

//字符串测点数据
typedef struct
{
    TAGID  nTagId;                       //测点ID，-1表示空闲
    int8 szVal[MAX_STR_LEN];             //值
} STR_TAG;

//目录信息
typedef  struct{
        int             nId;                         //目录ID
	char            szText[MAX_TEXT_LEN];        //目录名称
	short           nParentPos;                  //父节点位置
        unsigned char   nNodeType;                   //目录节点类型 0组 1采集器/网关设备
        unsigned char   bOnLine;                     //在线状态， 0离线 1在线
        unsigned char   res[2];                      //备用
} DIR_INFO;

//网关设备
typedef  struct{
        DIR_INFO        NodeInfo;                    //在线状态， 0离线 1在线
        char            szUUID[64];                  //UUID信息
        long long       nDataClientId;               //数据客户端ID
        long long       nControlClientId;            //反写控制客户端ID
        unsigned char   bDriverClient;               //是否驱动客户端， 0数据服务客户端 1驱动客户端
        unsigned char   res[3];
} GW_DEVICE;

typedef struct
{
    int           nClientId;    //客户端ID
    char          szIP[28];     //IP地址
    int           nPort;        //端口
    double        dLoginTime;   //登录时间
    double        dHeartTime;   //最后心跳时间
    int           nBaseId;      //数据库ID
    int           nNodeId;      //节点ID
    char          szDesp[32];   //描述
    char          szUUID[64];   //网关设备UUID
    int           nDriverId;    //来源接入驱动ID
} ONLINE_GW;

//目录参数
typedef  struct{
        int             nDirCount;                   //目录数
        DIR_INFO       *pDir;                        //目录信息
} DIR_PAR;

//网关UUID参数
typedef  struct{
        int             nNodeId;                     //网关节点ID
        char            szUUID[64];                  //UUID信息
} UUID_INFO;

//UUID参数
typedef  struct{
        int             nUUIDCount;                  //网关UUID数
        UUID_INFO      *pUUID;                       //网关UUID
} UUID_PAR;

//数据库信息
typedef struct{
	uint32          nBaseId;                     //数据库ID
	char            szBaseName[MAX_NAME_LEN];    //名称
	char            szBaseDesp[BASE_DESP_LEN];   //描述
	uint32          nTagCapacity;                //测点容量
	uint32          nCopies;                     //副本数
	uint32          nMainVNodeId;                //主虚拟节点ID
        int32           nIONodeId;                   //网关节点ID
} BASE_INFO; 

//----------------------------- 服务节点 -------------------------------//
//管理节点信息
typedef struct{
	uint32          nMNodeId;                    //节点ID
	char            szMNodeName[MAX_NAME_LEN];   //名称
	uint32          nMgmtIP01;                   //管理服务IP01
	uint32          nMgmtIP02;                   //管理服务IP02
	uint32          nSyncIP01;                   //同步服务IP01
	uint32          nSyncIP02;                   //同步服务IP02
        uint8           bIsMaster;                   //主从 1主 0从
        uint8           nStatus;                     //状态 0值班 1备用 2故障 3离线
} MNODE_INFO; 

//数据节点信息
typedef struct{
	uint32          nDNodeId;                    //节点ID
	char            szDNodeName[MAX_NAME_LEN];   //名称
	uint32          nDataIP01;                   //数据服务IP01
	uint32          nDataIP02;                   //数据服务IP02
	uint32          nSyncIP01;                   //同步服务IP01
	uint32          nSyncIP02;                   //同步服务IP02
	int             nVNodeCount;                 //虚拟节点数 
	char            szDataPath[MAX_PATH_LEN];    //数据路径
        uint8           res[19];                     //备用
        uint8           bMirror;                     //镜像服务器
        uint8           nStatus;                     //状态 1正常 0故障
} DNODE_INFO; 

//虚拟节点信息
typedef struct{
	int32           nVNodeId;                    //虚拟节点ID(2字节数据节点ID+2字节虚拟节点序号)
        int32           nDNodeId;                    //所属数据节点ID
	int32           nBaseId;                     //数据库ID
	uint32          nMaxTagCount;                //最大测点数 
	uint32          nCurTagCount;                //当前测点数
	int             nVGroupId;                   //当前节点副本节点组信息
        uint8           bIsMaster;                   //主从 1主 0从
	int             nUsed;                       //使用标识
} VNODE_INFO; 

//副本组-虚拟节点ID
typedef struct{
        int32           VNodeId[MAX_COPIES_COUNT];  //虚拟节点ID-副本组
        uint8           nCount;     //副本数
        uint8           nMasterPos; //主副本位置
        uint8           bUsed;      //是否使用
        uint8           res;        //备用
} VNODE_GROUP; 

//数据库虚拟节点组信息
typedef struct{
	uint32          nGroupId;                    //GroupId
	uint32          nBaseId;                     //数据库ID
	uint32          nVNodeCount;                 //虚拟节点数
	VNODE_INFO      **pVNode;                    //虚拟节点ID
} GROUP_INFO; 

//网关服务节点信息
typedef struct{
        uint32          nNodeId;                    //节点ID
        char            szNodeName[MAX_NAME_LEN];   //名称
        uint32          nMasterIP01;                //主网关服务IP01
        uint32          nMasterIP02;                //主网关服务IP02
        uint32          nSlaverIP01;                //从网关服务IP01
        uint32          nSlaverIP02;                //从网关服务IP02
        uint8           nStatus;                    //状态 0值班 1备用 2故障 3离线
} IONODE_INFO;

//计算服务节点信息
typedef struct{
        uint32          nNodeId;                    //节点ID
        char            szNodeName[MAX_NAME_LEN];   //名称
        uint32          nMasterIP01;                //主网关服务IP01
        uint32          nMasterIP02;                //主网关服务IP02
        uint32          nSlaverIP01;                //从网关服务IP01
        uint32          nSlaverIP02;                //从网关服务IP02
        uint8           nStatus;                    //状态 0值班 1备用 2故障 3离线
} CNODE_INFO;

//----------------------------- 用户权限 -------------------------------//
#define  MAX_USER_LEN         32                 //最大用户名长度
#define  MAX_PASSWORD_LEN     16                 //最大密码长度
#define  MAX_USER_DB_COUNT    16                 //最大用户可操作数据库
#define  MAX_FUN_RIGHT        64                 //功能权限数

enum {
    db_owner,            //该角色的用户可以在数据库中执行任何操作。
    db_accessadmin,      //该角色的成员可以从数据库中增加或者删除用户。
    db_backupopperator,  //该角色的成员允许备份数据库。
    db_datareader,       //该角色的成员允许从任何表读取任何数据。
    db_datawriter,       //该角色的成员允许往任何表写入数据。
    db_ddladmin,         //该角色的成员允许在数据库中增加、修改或者删除任何对象（即可以执行任何DDL语句）。
    db_denydatareader,   //该角色的成员被拒绝查看数据库中的任何数据，但是他们仍然可以通过存储过程来查看。
    db_denydatawriter,   //像db_denydatareader角色，该角色的成员被拒绝修改数据库中的任何数据，但是他们仍然可以通过存储过程来修改。
    db_securityadmin,    //该角色的成员可以更改数据库中的权限和角色。
};

//功能权限项
#define  QX_REALDATA_READ        0               //允许实时数据读权限
#define  QX_REALDATA_WRITE       1               //允许实时数据写权限
#define  QX_HISDATA_READ         2               //允许历史数据读权限
#define  QX_HISDATA_WRITE        3               //允许历史数据写权限
#define  QX_DBPAR_VIEW           4               //允许数据库参数查看权限
#define  QX_DBPAR_MODIFY         5               //允许数据库参数编辑权限
#define  QX_NODEPAR_VIEW         6               //允许节点参数查看权限
#define  QX_NODEPAR_MODIFY       7               //允许节点参数编辑权限
#define  QX_USERPAR_VIEW         8               //允许用户参数查看权限
#define  QX_USERPAR_MODIFY       9               //允许用户参数编辑权限
#define  QX_CREATE_DB            10              //允许创建数据库权限
#define  QX_MODIFY_DB            11              //允许修改数据库权限
#define  QX_DELETE_DB            12              //允许删除数据库权限
#define  QX_MODIFY_CAPACITY      13              //允许修改数据库测点容量
#define  QX_CREATE_TAG           14              //允许创建测点权限
#define  QX_MODIFY_TAG           15              //允许修改测点权限
#define  QX_DELETE_TAG           16              //允许删除测点权限
#define  QX_LOG_VIEW             20              //允许日志信息查看权限

//用户类型
#define  USER_ADMIN_TYPE         0               //超级用户
#define  USER_COMMON_TYPE        1               //普通用户

//用户权
typedef struct{
    unsigned char  FunRight[MAX_FUN_RIGHT];      //功能权限
	int            nBaseCount;                   //拥有数据库个数
	int            nBaseId[MAX_USER_DB_COUNT];   //用户操作数据库ID
} USER_RIGHT; 

//用户信息
typedef struct{
	int            nUserId;                      //用户ID
	char           szUserName[MAX_USER_LEN];     //用户名
	char           szPassword[MAX_PASSWORD_LEN]; //密码
	unsigned short nUserType;                    //用户类型，0：超级用户，1：自定义
	unsigned short nRole;                        //用户角色
        USER_RIGHT     UserRight;                    //用户权限
	int            nGroupId;                     //所属用户组
	char           nRes[32];                     //备用
} USER_INFO; 

//用户组
typedef struct _USER_GROUP{
	int            nGroupId;                     //用户组ID
	char           szGroupName[MAX_NAME_LEN];    //用户组名
	char           nRes[32];                     //备用
} USER_GROUP; 

//----------------------------- 状态信息 -------------------------------//
enum _status {
    STATUS_OFFLINE,    //离线状态
    STATUS_CREATING,   //创建状态
    STATUS_UNSYNCED,   //未同步状态
    STATUS_SLAVE,      //从状态
    STATUS_MASTER,     //主状态
    STATUS_READY,      //值班状态
};

typedef  struct{
    int             nTotleMemSize;     //内存总大小
    int             nFreeMemSize;      //剩余内存大小
    int             nTotleDiskSize;    //磁盘总大小
    int             nFreeDiskSize;     //剩余磁盘大小
    int             nCpuUsed;          //CPU使用率
    int             nClientCount;      //在线客户端数
    int             nVNodeUsedCount;   //已使用虚拟节点数
    uint8           bOnLine;           //在线状态
    uint8           bMaster;           //主节点
    uint8           res[2];            //备用
} NODE_STATE; //数据节点状态

typedef struct
{
    TAGID          nTagId;        //测点编号
    uint8          nHour;         //时
    uint8          nMin;          //分
    uint16         nRecordCount;  //记录数
    uint16         nPackSize;     //包大小
} COLLECT_PACKHEAD; //采集器数据包头信息

typedef struct
{
    COLLECT_PACKHEAD  PackHead;   //数据包头
    uint8             szPackage[MAX_COLLECT_PACK_LEN]; //包大小
} COLLECT_DATAPACK; //采集器数据包信息

#pragma pack()

#endif // SYS_DEF

